会话初始协议(Session Initiation Protocol,SIP)是一个控制发起、修改和终结交互式多媒体会话的信令协议,主要用于创建、修改和释放一个或多个参与者的会话。SIP是由 IETF(Internet Engineering Task Force,Internet工程任务组)在 RFC 2543 中定义的,最早发布于 1999 年 3 月,后来在 2002 年 6 月又发布了一个新的标准 RFC 2361。
SIP 是一个基于文本的协议,报文格式与 HTTP和SMTP 相似。下面是SIP 请求与 HTTP 请求的一个简单的对比:
HTTP请求:GET /index.html HTTP/1.1
SIP请求:INVITE sip:seven@freeswitch.org.cn SIP/2.0
由此可见,SIP/HTTP请求一般由请求动作、资源地址和协议版本等三部分所组成。在HTTP请求中,GET指明一个获取资源(文件)的动作,而/index.html则是资源的地址,最后是HTTP协议版本号;在SIP请求中,INVITE表示发起一次会话建立请求,seven@freeswitch.org.cn为请求的URI地址(称为SIP URI),最后是SIP协议版本号。其中,SIP URI类似电子邮件地址,其格式为“协议:名称@主机地址”。
此外,SIP是一个支持对等通信的信令协议,可在无中心的服务器的情况下,只要通信双方都彼此知道对方地址,就可以直接进行端到端通信。
JsSIP是一个实现了SIP协议功能的、简单易用的JavaScript库。它可以利用SIP和WebRTC在任何网站上实现一个全功能的SIP端点(Endpoint)。使用JsSIP的任何网站都可以使用音频的实时通信功能。
使用JsSIP发起语音通话的状态转移图如下图所示:
图1. JsSIP语音通话状态转移图
上图中,“IDLE”指通话的待机状态,即在发起通话之前或结束通话之后SDK均返回此状态;“Trying”指通话发起状态,即在主叫用户发起通话之后,且被叫用户尚未接听之前,通话双方均处于此状态;“ANSWER”指通话接听状态,即在被叫用户接听来电之后,通话双方均处于接听状态;“HANGUP”指通话结束状态,且无论通话双方谁先结束通话,双方都将进入此状态。此外,一旦进入HANGUP状态,SDK会自动转移到IDLE状态。
APP在使用通话功能模块时,需要根据通话的当前状态,或SDK的通话状态通知,显示相应的通话界面,以及执行正确的通话控制操作。
类jssip.rtcsession表示WebRTC媒体(音频/视频)会话,它可以由本地用户或远程对等方发起,其中内部包含有rtcninja.rtcpeerconnection实例(可接受音视频连接属性)。
WebRTC规范尚不完善,为了在不同的浏览器中透明的实现实时音视频通讯,特地引入了这个库。
JSSIP所有的异步 I/O 操作在完成时都会发送一个事件到事件队列,然后由EventEmiter通过回调函数的形式发送给Web页面,而这些回调函数一般都封装在一些对象之中(例如:call.on('accepted',function(e)))。
调用JsSIP对象的时序图如下图所示
图2. JSSIP的时序图
由上图可见,JsSIP库主要提供7个对象(注:SDK目前没有用到消息模块)。这些对象之间的调用关系如下:
① JsSIP首先创建UA对象;
② UA对象接着先后创建Transport对象和Session对象;
③ Session对象创建Requestsender和Transaction对象;
④ 最终由Transport对象将SIP报文发送出去的。